package main

import (
	"fmt"
	"time"
)

// 理念：不要通过共享内存来通信；通过通信来共享内存

/**
channel 例子三：把 channel 作为返回值

	在使用 channel 的时候我们要告诉调用者，我这channel的方法是发送数据的，还是接收数据的

	chan<- int 表示发送数据

	<-chan int 表示接受数据

	针对下面的例子就是：
	chan<- int 表示发送数据，但是我里面同时也做了接收操作，那么我的里面就是接受数据

	<-chan int 表示接受数据，但是我里面做了发送操作，那么我的里面就是发送数据



 */

 // 表示一个 发送数据的channel，也就是这个 函数只能写，不能读
func createWorker3(id int) chan<- int {
	// 创建一个channel
	// chan int 表示我这个chan里面的值只能是 int
	c := make(chan int)

	// 需要在里一个 协程里面接收 channel 的值
	// 不然这个死循环，并且还拿不到 channel 里面的值
	go func() {
		for {
			// 从 channel 里面获取数据，赋值给 n
			n := <-c
			fmt.Println("接收到的数据： ",n)
			// 发现输出的顺序不一样，这是因为，运行的时候是乱序的，谁先执行是随机的
		}
	}()


	return c
}

func chanDemo3()  {
	// var c chan int // 此时 c == nil
	var channels [10]chan<- int // channel 数组

	for i :=0;i < 10 ;i++  {
		// 创建一个 chan
		channels[i] = createWorker3(i)
	}



	// 往  channel 发送数据
	for i :=0;i < 10 ;i++  {
		channels[i] <- 'a' + i
	}

	for i :=0;i < 10 ;i++  {
		channels[i] <- 'A' + i
	}


	// 睡眠一下
	// 因为只能打印出 1，还来不及打印 2 的时候，程序已经结束了
	// 所以睡眠一下
	time.Sleep(time.Millisecond)

}

func main() {
	
}
